package com.springboot.onlinemusicserver.utils.common;

import com.springboot.onlinemusicserver.utils.req.GetMusicParam;
import com.springboot.onlinemusicserver.utils.req.UserLoginParam;
import com.springboot.onlinemusicserver.utils.req.UserRegisterParam;
import org.apache.tika.Tika;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description :
 * User: jiume
 * Date: 2025-05-20
 * Time: 14:45
 */
public class CheckParam {

    /**
     * 验证登录参数是否合法
      * @param userLoginParam 封装后的登录参数
     * @return 不为空-true
     */
    public static boolean checkLoginParamIsBlank(UserLoginParam userLoginParam) {
        if (userLoginParam == null
                || !StringUtils.hasText(userLoginParam.getUserName())
                || !StringUtils.hasText(userLoginParam.getPassword())) {
            return false;
        }
        return true;
    }

    /**
     * 判断用户名和密码的长度是否小于6位
     * @param userName 用户名
     * @param password 密码
     * @return 小于-false
     */
    public static boolean checkLoginParamLength(String userName, String password) {
        if (userName.length() < 6 || password.length() < 6) {
            return false;
        }
        return true;
    }

    /**
     * 验证注册参数是否合法
     * @param userRegisterParam 封装后的注册参数
     * @return 不为空-true
     */
    public static boolean checkRegisterParamIsBlank(UserRegisterParam userRegisterParam) {
        if (userRegisterParam == null
                || !StringUtils.hasText(userRegisterParam.getUserName())
                || !StringUtils.hasText(userRegisterParam.getPassword())
                || !StringUtils.hasText(userRegisterParam.getCheckPassword())) {
            return false;
        }
        return true;
    }

    /**
     * 判断用户名、密码、确认密码的长度是否小于6位
     * @param userName 用户名
     * @param password 密码
     * @param checkPassword 确认密码
     * @return 小于—false
     */
    public static boolean checkRegisterParamLength(String userName,
                                                   String password,
                                                   String checkPassword) {
        if (userName.length() < 6 || password.length() < 6
                || checkPassword.length() < 6) {
            return false;
        }
        return true;
    }

    /**
     * 检验文件是否为 mp3 文件
     * @param file 文件
     * @return 是mp3-true
     */
    public static boolean checkUploadParam(MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        return hasMp3Extension(fileName)
                && isMp3ByMimeType(file)
                && isMp3ByMagicNumber(file);
    }

    // 后缀判断
    private static boolean hasMp3Extension(String fileName) {
        // endsWith方法，检验字符串是否以指定字符串为结尾
        return fileName != null && fileName.toLowerCase().endsWith(".mp3");
    }

    // 使用 Apache Tika 判断 MIME 类型
    private static boolean isMp3ByMimeType(MultipartFile file) throws IOException {
        Tika tika = new Tika();
        String mimeType = tika.detect(file.getInputStream());
        return "audio/mpeg".equals(mimeType);
    }

    // 通过文件头部判断（魔数）
    private static boolean isMp3ByMagicNumber(MultipartFile file) throws IOException {
        InputStream is = file.getInputStream();
        byte[] header = new byte[3];
        int read = is.read(header, 0, 3);
        is.close();
        if (read < 3) return false;
        String magic = new String(header);
        return "ID3".equals(magic); // 仅适用于有 ID3 的 mp3 文件
    }

    /**
     * 检验歌手和歌名是否为空
     * @param singer 歌手
     * @param musicName 歌名
     * @return 空-false
     */
    public static boolean checkGetMusicParam(String singer, String musicName) {
        if (!StringUtils.hasText(singer) ||
                !StringUtils.hasText(musicName)) {
            return false;
        }
        return true;
    }

    /**
     * 校验集合内部内容是否全部大于0
     * @param musicIds List集合
     * @return 不满足-false
     */
    public static boolean checkDeleteBatchParam(List<Long> musicIds) {
        if (musicIds == null || musicIds.size() == 0) {
            return false;
        }
        for (Long musicId : musicIds) {
            if (musicId == null || musicId <= 0) {
                return false;
            }
        }
        return true;
    }
}
